import { defineStore } from 'pinia'
import { useUserStore } from './user'
import { router } from '@/router/index'
import { permissionRoutes } from '@/router/permission-router'

export const usePermissionStore = defineStore('permission', {
  state: () => ({
    allRoutes: [], // 全部路由
    accessRoutes: [], // 权限匹配之后的路由
    menus: [], // 左侧菜单栏
  }),

  actions: {
    // 设置用户权限，生成左侧菜单以及路由
    setPermissions() {
      this.menus = this.generateMenuItem(useUserStore().role, permissionRoutes)
    },

    // 生成左侧菜单栏
    generateMenuItem(role, parent) {
      const menu = parent.filter(
        (x) => !x.meta?.role || x.meta?.role?.includes(role)
      )

      menu.forEach((item) => {
        // 生成路由
        this.generateAllRoute(item, role)
        this.generateAccessRoute(item, role)
        if (item.children) {
          item.children = this.generateMenuItem(role, item.children)
        }
      })

      return menu
    },

    // 根据权限生成路由
    generateAccessRoute(route, role) {
      // 当有 name , path 以及 component 属性，并且符合当前的用户权限之后，再生成动态路由
      if (
        !route.meta?.disabled &&
        !route?.path?.startsWith('http') &&
        route.name &&
        route.path &&
        (!route.meta?.role || route.meta?.role?.includes(role))
      ) {
        // 先判断是否已存在路由，没有则生成
        if (!router.hasRoute(route.name)) {
          this.accessRoutes.push(route)
          router.addRoute(route)
        }
      }
    },

    // 生成全部路由
    generateAllRoute(route, role) {
      // 当有 name , path 以及 component 属性，并且符合当前的用户权限之后，再生成动态路由
      if (
        !route.meta?.disabled &&
        route.name &&
        (!route.meta?.role || route.meta?.role?.includes(role))
      ) {
        // 先判断是否已存在路由，没有则生成
        if (!this.allRoutes?.findIndex((x) => x.name === route.name) > -1) {
          this.allRoutes.push(route)
        }
      }
    },

    resetPermission() {
      this.$reset()
    },
  },

  persist: {
    key: 'permission',
  },
})
